home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48hor2 / gentab9.c < prev    next >
C/C++ Source or Header  |  1994-01-04  |  6KB  |  273 lines

  1. /**
  2.     Reference table generator, HP48 Utility
  3.     Borland C++ 3.0
  4.     Detlef Mueller, 24.04.1992
  5.     Q&D hack - Usage: GENTAB <[entries file] >[table file]
  6.  
  7.     The sequence
  8.         GENTAB <entries.a >tab.a
  9.         SASM -E -N -H -o tab tab.a
  10.     should generate the downloadable file tab.
  11.  
  12.     0.000 24.04.1992 DM    coded
  13.       100 25.08.1992 DM    mofified output to feed it into sasm only
  14. **/
  15.  
  16. #include    <stdio.h>
  17. #include    <stdlib.h>
  18. #include    <stdarg.h>
  19. #include    <string.h>
  20. #include    <ctype.h>
  21.  
  22. #include    <alloc.h>
  23. #include    <errno.h>
  24. #include    <io.h>                /* MesS-DOS */
  25. #include    <fcntl.h>            /* MesS-DOS */
  26.  
  27.  
  28. #define    MAJVER        0
  29. #define    MINVER        0
  30. #define    REVER        0
  31.  
  32. #define    WRKFILE        "________.TMP"
  33. #define    STARTCH        ' '
  34.  
  35.  
  36. typedef enum
  37.     {
  38.         ERROR,
  39.         WARNING
  40.     }
  41.     ERRTYPE ;
  42.  
  43. typedef    struct
  44.     {
  45.         char
  46.         name[13] ;
  47.         long
  48.         addr ;
  49.     }
  50.     ENTRY ;
  51.  
  52.  
  53. static ENTRY
  54.     **table = NULL ;
  55.  
  56. static unsigned int
  57.     entries = 0,
  58.     hash[128 - STARTCH] = { 0 } ;
  59.  
  60.  
  61. void  Error ( ERRTYPE messt, char *msg, ... )
  62. {
  63.     va_list
  64.     argptr ;
  65.     char
  66.     *tstr,
  67.     str[81] ;
  68.  
  69.     va_start( argptr, msg ) ;
  70.     vsprintf( str, msg, argptr ) ;
  71.  
  72.     switch ( messt )
  73.     {
  74.     case ERROR :
  75.         tstr = "\nError: %s " ;
  76.         break ;
  77.  
  78.     case WARNING :
  79.         tstr = "\nWarning: %s " ;
  80.         break ;
  81.  
  82.     default :
  83.         tstr = "Unknown error: %s " ;
  84.     }
  85.  
  86.     fprintf( stderr, tstr, str ) ;
  87.  
  88.     if ( errno != EZERO )
  89.     perror( "" ) ;
  90.     else
  91.     fputc( '\n', stderr ) ;
  92.  
  93.     va_end( argptr ) ;
  94.  
  95.     if ( messt == ERROR )
  96.     exit( -1 ) ;
  97. }
  98.  
  99. static int compare ( const void *s1, const void *s2 )
  100. {
  101.     register char
  102.     *s_1, *s_2 ;
  103.  
  104.     for ( s_1 = (*(ENTRY **)s1)->name, s_2 = (*(ENTRY **)s2)->name ;
  105.       *s_1 || *s_2 ; ++s_1, ++s_2 )
  106.     if ( *s_1 != *s_2 )
  107.         return ( *s_1 - *s_2 ) ;
  108.  
  109.     return ( 0 ) ;
  110. }
  111.  
  112. static void Work ( void )
  113. {
  114.     static char
  115.     image[] = "\\|/-" ;
  116.     static int
  117.     i = 0 ;
  118.  
  119.     fputc( '\b', stderr ) ;
  120.     fputc( image[i = (i + 1) & 3], stderr ) ;
  121. }
  122.  
  123. static void WriteTab ( FILE *fout )
  124. {
  125.     unsigned int
  126.     i, *h ;
  127.     char
  128.     ch = '\0' ;
  129.     ENTRY
  130.     **entry ;
  131.  
  132.     fputs( "\nWriting hash table ...", stderr ) ;
  133.  
  134.     fputs( "\tNIBASC\t`HPHP48-E`\n"
  135.        "\tCON(5)\t#02A2C\t\t=DOCSTR\n"
  136.        "\tREL(5)\tTabEnd\n"
  137.        "\tNIBASC\t`\\00\\n`\n", fout ) ;
  138.  
  139.     for ( i = 0, h = hash ; i < (sizeof( hash ) / sizeof( *hash )) - 1 ; ++i )
  140.     if ( *h++ )
  141.         fprintf( fout, "\tREL(5)\t_%c_\n", i + STARTCH ) ;
  142.     else
  143.         fprintf( fout, "\tCON(5)\t0\n" ) ;
  144.  
  145.     fprintf( fout, "\tREL(5)\tTabEnd\n" ) ;
  146.  
  147.     fputs( "\nWriting reference table ...  ", stderr ) ;
  148.  
  149.     for ( i = 0, entry = table ; i < entries ; ++i, ++entry )
  150.     {
  151.     if ( *(*entry)->name != ch )
  152.         fprintf( fout, "_%c_\n", ch = *(*entry)->name ) ;
  153.  
  154.     fprintf( fout,
  155.          "\tCON(6)\t#%lX\n"
  156.          "\tNIBASC\t`%s`\n",
  157.          (*entry)->addr | ((long)strlen( (*entry)->name ) << 20),
  158.          (*entry)->name ) ;
  159.  
  160.     free( *entry ) ;
  161.  
  162.     if ( ! (i % 100) )
  163.         Work() ;
  164.     }
  165.  
  166.     fputs( "TabEnd\n", fout ) ;
  167.  
  168.     free( table ) ;
  169.  
  170.     fputs( "\b ", stderr ) ;
  171. }
  172.  
  173. static void ReadTab ( FILE *fin )
  174. {
  175.     static char
  176.     line[80], buffer[256] ;
  177.     char
  178.     *pl, *pa ;
  179.     unsigned int
  180.     i ;
  181.     long
  182.     addr ;
  183.     ENTRY
  184.     entry, **tab ;
  185.     FILE
  186.     *ftmp ;
  187.  
  188.     if ( ! (ftmp = fopen( WRKFILE, "wb" )) )
  189.     Error( ERROR, "Can't create <%s>", WRKFILE ) ;
  190.  
  191.     fprintf( stderr, "\nReading and converting input ...  " ) ;
  192.  
  193.     while ( fgets( line, 80, fin ) )
  194.     if ( strlen( line ) && *line != '\n' )
  195.     {
  196.         pl = strcpy( buffer, line ) ;
  197.  
  198.         if (    ! (pl = strtok( *pl == '=' ? pl + 1 : pl, "\n\r\t " ))
  199.          || strlen( pl ) > 12
  200.          || *pl == '*'
  201.          || *pl == '~'
  202.          || ! strtok( NULL, "\n\r\t " )
  203.          || ! (pa = strtok( NULL, "\n\r\t " ))
  204.          || ! (i = sscanf( *pa == '#' ? pa + 1 : pa, "%lX", &addr ))
  205.          || i == EOF
  206.          || (addr & 0xFFF00000L) )
  207.         continue ;
  208.  
  209.         hash[*pl - STARTCH] = 1 ;
  210.         strcpy( entry.name, pl ) ;
  211.         entry.addr = addr ;
  212.  
  213.         if ( ! fwrite( &entry, sizeof( ENTRY ), 1, ftmp ) )
  214.         Error( ERROR, "Write error on <%s>", WRKFILE ) ;
  215.  
  216.         if ( ! (++entries % 100) )
  217.         Work() ;
  218.     }
  219.  
  220.     fclose( ftmp ) ;
  221.  
  222.     if ( ! entries )
  223.     Error( ERROR, "Sorry, no entries found" ) ;
  224.  
  225.     fputs( "\b ", stderr ) ;
  226.     fprintf( stderr, "\nFound %u symbols\nGenerating table ...  ",
  227.          entries ) ;
  228.  
  229.     if ( ! (ftmp = fopen( WRKFILE, "rb" )) )
  230.     Error( ERROR, "Can't reopen <%s>", WRKFILE ) ;
  231.  
  232.     if ( ! (table = (ENTRY **)malloc( entries * sizeof( ENTRY *) )) )
  233.     Error( ERROR, "Can't alloc room for %u entries", entries ) ;
  234.  
  235.     for ( i = 0, tab = table ; i < entries ; ++i, ++tab )
  236.     {
  237.     if ( ! (*tab = (ENTRY *)malloc( sizeof( ENTRY ) )) )
  238.         Error( ERROR, "Can't alloc %d bytes room for %uth entry",
  239.            sizeof( ENTRY ), i ) ;
  240.  
  241.     if ( ! fread( *tab, sizeof( ENTRY ), 1, ftmp ) )
  242.         Error( ERROR, "Can't read %uth entry from <%s>", i, WRKFILE ) ;
  243.  
  244.     if ( ! (i % 100) )
  245.         Work() ;
  246.     }
  247.  
  248.     fputs( "\b ", stderr ) ;
  249.  
  250.     fclose( ftmp ) ;
  251.     unlink( WRKFILE ) ;
  252. }
  253.  
  254. void  main ( int argc, char *argv[] )
  255. {
  256.     fprintf( stderr,
  257.          "\n%s, Version %d.%d.%d, %s  %s  BC %X.%X, (c) 1992 DM.\n",
  258.          argv[0], MAJVER, MINVER, REVER, __DATE__, __TIME__,
  259.          __TURBOC__ >> 8, __TURBOC__ & 0x00FF ) ;    /* MesS-DOS */
  260.  
  261.     setmode( fileno( stdout ), O_BINARY ) ;        /* MesS-DOS */
  262.     setmode( fileno( stdin ), O_BINARY ) ;        /* MesS-DOS */
  263.  
  264.     ReadTab( stdin ) ;
  265.     fprintf( stderr, "\nSorting (by name)..." ) ;
  266.     qsort( table, entries, sizeof( ENTRY * ), compare ) ;
  267.     WriteTab( stdout ) ;
  268.  
  269.     fprintf( stderr, "\n\nNow:    SASM -E -N -H -o tab tab.a" ) ;
  270.  
  271.     exit( 0 ) ;
  272. }
  273.